x

Приведение ссылочных типов

  • Возможность вызвать метод определяется по типу ссылки
  • Ссылку нельзя привести к произвольному типу
  • Сслыку можно привести к более общему типу
  • Ссылку можно привести к реальному типу объекта
  • Оператор instanceof проверяет тип объекта

Оператор instanceof

// ColorSquare extends Square
ColorSquare s = new ColorSquare();
s instanceof ColorSquare // true
s instanceof Square // true
s instanceof String // false

Upcasting

Приведение к суперклассу

Square x = s;
x.area(); // OK
x.getColor(); // Ошибка - нет такого метода

Downcasting

Приведение к реальному типу

Если изначально был таким

ColorSquare s = new ColorSquare();
Square x = s;
x.area(); // OK

ColorSquare y = (ColorSquare) x;
y.getColor(); // OK

А вот если нет

Square s = new ColorSquare();
Square x = s;
x.area(); // OK

ColorSquare y = (ColorSquare) x;
// ClassCastException

Pattern Matching

Перед даункастом лучше проверить тип через instanceof

...
if (x instanceof ColorSquare) {
    ColorSquare y = (ColorSquare) x;
    y.getColor(); // OK
}

Либо более короткий синтаксис

...
if (x instanceof Colorsquare y) {
    y.getColor(); // OK
}

То есть после апкаста джава не забывает какой тип был изначально

Left-click: follow link, Right-click: select node, Scroll: zoom
x